<template>
  <section>访问者模式</section>
</template>

<script>
/**
 * @Description:访问者模式
 * @author ZY
 * @date 2022/11/23 22:41
 */
export default {
  name: "DesignVisitor",
  data() {
    return {}
  },
  created() {
    console.log('*******访问者模式开始********')
    this.main()
    console.log('*******访问者模式结束********')
  },
  methods: {
    /*
    * 访问者模式：表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
    * 场景：对象结构中对象对应的类很少改变，但经常需要在此对象结构上定义新的操作
          需要对一个对象结构中的对象进行很多不同的并且不相关的操作，而需要避免让这些操作"污染"这些对象的类，也不希望在增加新操作时修改这些类。
    * */
    main() {
      // 访问者
      class Visitor {
        constructor() {}
        visitConcreteElement(ConcreteElement) {
          ConcreteElement.operation()
        }
      }
// 元素类
      class ConcreteElement{
        constructor() {
        }
        operation() {
          console.log("ConcreteElement.operation invoked");
        }
        accept(visitor) {
          visitor.visitConcreteElement(this)
        }
      }
// client
      let visitor = new Visitor()
      let element = new ConcreteElement()
      element.accept(visitor)
    }
  }
}
</script>

<style scoped>

</style>
